﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Array_List
{
    //ArrayList реалізує інтерфейс IList. Використовує масив, розмір якого динамічно збільшується при потребі
    class Program
    {
        static void Main(string[] args)
        {
            // має 2 конструктора.
            // 1. Приймає на вхід колекцію з якої буде створена копія ArrayList(ICollection c);
            // 2. Приймає на вхід початкову ємність  ArrayList(int capacity);
            ArrayList arr = new ArrayList();

            // ємність колекції. По замовчуванню рівна 0, після додання першого елементу - 4, після 4 --> 8
            Console.WriteLine("1. Array capacity: {0}", arr.Capacity);

            // кільксть елементів в колекції! Не плутати з ємністю!            
            Console.WriteLine("2. Elements count: {0}", arr.Count);

            // Add додає новий елемент в КІНЕЦЬ масиву
            arr.Add("Hello. ");            

            // AddRange додає набір/масив значень в КІНЕЦЬ масиву
            // якщо кількість елементів стає більшою за ємність,
            // то ємність збільшується в два рази
            arr.AddRange(new string[]{"How"," ","are", " ", "you?"});

            Console.WriteLine("3. Array capacity: {0}", arr.Capacity);            
            Console.WriteLine("4. Elements count: {0}", arr.Count);


            for (int i = 0; i < arr.Count; i++)
            {
                // arr[i] оскільки колекція має індексатор
                // то доступатися до елемента колекції можна по індексу
                // як до звичайного елемента масиву
                Console.Write(arr[i]);
            }
            Console.WriteLine();

            // GetRange - повертає нову колекцію.
            // Вказуємо початкову позицію та кількість елементів GetRange(int index, int count)
            ArrayList range = arr.GetRange(3, 3);

            // повертає позицію обєкта в масиві
            int pos = range.IndexOf("you?");
            Console.WriteLine("'you?' positon: {0}",pos);

            //Insert(int index, object value) - вставляємо елемент в вказану позицію
            range.Insert(0,"How ");

            // видаляє елемент з вказаної позиції
            range.RemoveAt(range.Count - 1);

            // можна використовувати цикл foreach
            // тому що, ArrayList реалізує метод IEnumerator GetEnumerator()!
            foreach (string v in range)
            {
                Console.Write(v);
            }
            Console.WriteLine();

            // сортує елементи
            range.Sort();

            // сортує за вказаним компаратором, який має унаслідуватися від IComparer
            range.Sort(new MyComparer());

            // очищає колекцію
            range.Clear();

        }
    }
}
